<?php
class ViajesController extends CustomController
{

    public function listarViajes($status = STATUS_PENDING)
    {
        // Login
        $this->userLoggedIn();
        $this->isAdmin();
        // Get page and list
        $tipoListado = ($status == STATUS_PENDING)?MODULE_VIAJES_LISTAR_VIAJES:(($status == STATUS_HIDDEN)?MODULE_VIAJES_LISTAR_VIAJES_FINALIZADOS:MODULE_VIAJES_LISTAR_VIAJES_ACTIVOS);
        $pageNumber = $this->getPage();
        $viajes = $this->model->getViajes($pageNumber, $status);
        $vars = array(
            'monitorear_action'    => $this->link(MODULE_MONITOREO, MODULE_MONITOREO_MONITOREAR_VIAJE).'?id=',
            'delete_action'        => $this->link(MODULE_VIAJES, MODULE_VIAJES_BORRAR_VIAJE).'?id=',
            'link_historial_viaje' => $this->link(MODULE_ALERTAS, MODULE_ALERTAS_VIAJE).'?id=',
            'pagination_link'      => $this->link(MODULE_VIAJES, $tipoListado),
            'viajes'               => $viajes
        );
        $this->view->listarViajes($vars, $status);
    }

    public function listarViajesActivos()
    {
        $this->listarViajes(STATUS_ONLINE);
    }

    public function listarViajesFinalizados()
    {
        $this->listarViajes(STATUS_OFFLINE);
    }

    public function crearViaje($programar = false)
    {
        // Login
        $this->userLoggedIn();
        $this->isAdmin();
        // Default vars
        $conductores = $this->model->getConductores();
        $vehiculos   = $this->model->getVehiculos();
        $grupos      = $this->model->getGrupos($vehiculos);
        $rutas       = $this->model->getRutas();
        if (!empty($vehiculos))
        {
            $unsetIds = array();
            foreach ($vehiculos as $idVehiculo => $vehiculo)
            {
                if (empty($vehiculo['in_group'])) $unsetIds[]= $idVehiculo;
            }
            if (!empty($unsetIds))
            {
                foreach ($unsetIds as $id)
                {
                    unset($vehiculos[$id]);
                }
            }
        }
        $vars = array(
            'conductores'          => $conductores,
            'grupos'               => $grupos,
            'vehiculos'            => $vehiculos,
            'rutas'                => $rutas,
            'link_horario_llegada' => $this->link(MODULE_VIAJES, MODULE_VIAJES_HORARIO_LLEGADA),
            'link_viajes_a_crear'  => $this->link(MODULE_VIAJES, MODULE_VIAJES_VIAJES_A_CREAR),
            'link_crear'           => $this->link(MODULE_VIAJES, (($programar)?MODULE_VIAJES_PROGRAMAR_VIAJES:MODULE_VIAJES_CREAR_VIAJE))
        );
        // Datos suficientes?
        if (empty($vars['conductores']) || empty($vars['grupos']) || empty($vars['vehiculos']) || empty($vars['rutas']))
        {
            $this->error("El sistema no dispone de los datos suficientes para crear viajes. Por favor aseg&uacute;rese de tener cargados previamente conductores, grupos, vehiculos, y rutas");
            $this->redirectTo(MODULE_HOME);
        }
        // Post?
        if ($_POST)
        {
            $viaje = $this->getValue('viaje');
            // Validacion
            $errs = array();
            $this->validarViaje($viaje, $conductores, $vehiculos, $grupos, $rutas, $errs, $programar);
            if (!empty($errs))
            {
                $this->error("No se ha podido crear el viaje por los siguientes errores:<br/>-".implode('<br/>-', $errs));
            }
            else
            {
                if ($programar)
                {
                    if ($this->model->programarViajes($viaje))
                    {
                        $this->notice('Viajes programados con &eacute;xito!');
                        $this->redirectTo(MODULE_VIAJES);
                    }
                    else
                    {
                        $this->error('Ha ocurrido un error al tratar de programar los viajes. Por favor intente nuevamente.');
                    }
                }
                else
                {
                    if ($this->model->insertarViaje($viaje))
                    {
                        $this->notice('Viaje programado con &eacute;xito!');
                        $this->redirectTo(MODULE_VIAJES);
                    }
                    else
                    {
                        $this->error('Ha ocurrido un error al tratar de insertar el viaje. Por favor intente nuevamente.');
                    }
                }
            }
            if ($programar)
            {
                if (!empty($viaje['dias']) && is_array($viaje['dias']))
                {
                    $dias = array();
                    foreach ($viaje['dias'] as $dia)
                    {
                        $dias[$dia] = $dia;
                    }
                    if (isset($dias[1])) $viaje['dia_1_checked'] = 'checked="checked"';
                    if (isset($dias[2])) $viaje['dia_2_checked'] = 'checked="checked"';
                    if (isset($dias[3])) $viaje['dia_3_checked'] = 'checked="checked"';
                    if (isset($dias[4])) $viaje['dia_4_checked'] = 'checked="checked"';
                    if (isset($dias[5])) $viaje['dia_5_checked'] = 'checked="checked"';
                    if (isset($dias[6])) $viaje['dia_6_checked'] = 'checked="checked"';
                    if (isset($dias[7])) $viaje['dia_7_checked'] = 'checked="checked"';
                }
            }
            else
            {
                $viaje['salida'] = (!empty($viaje['salida']))?date('m/d/Y H:i', $viaje['salida']):'';
            }
            $vars['viaje'] = $viaje;
        }
        $this->view->crearViaje($vars, $programar);
    }

    public function programarViajes()
    {
        $this->crearViaje(true);
    }

    // Validar un viaje
    private function validarViaje(&$viaje, &$conductores, &$vehiculos, &$grupos, &$rutas, &$errs, $programar = false)
    {
        // Nombre del viaje
        if (empty($viaje['nombre']))
        {
            $viaje['nombre'] = '';
            $errs[]= 'El nombre del viaje no puede estar vac&iacute;o';
        }
        if ($programar)
        {
            // Fecha desde
            if (empty($viaje['desde']))
            {
                $errs[]= 'La fecha -desde- para programar los viaje no puede estar vac&iacute;a';
            }
            if (empty($viaje['hasta']))
            {
                $errs[]= 'La fecha -hasta- para programar los viaje no puede estar vac&iacute;a';
            }
            if (empty($viaje['horario']))
            {
                $errs[]= 'El horario de salida de los viajes a programar no puede estar vac&iacute;o';
            }
        }
        else
        {
            // Fecha de salida
            if (empty($viaje['salida']))
            {
                $viaje['salida'] = '';
                $errs[]= 'El horario de salida del viaje no puede estar vac&iacute;o';
            }
            else
            {
                $salidaTs = strtotime($viaje['salida']);
                if (!empty($salidaTs) && ($salidaTs > time()))
                {
                    $viaje['salida'] = $salidaTs;
                }
                else
                {
                    $viaje['salida'] = '';
                    $errs[]= 'El horario de salida del viaje no es correcto';
                }
            }

        }
        // Vehiculo
        if (empty($viaje['fkvehiculo']))
        {
            $viaje['fkvehiculo'] = '';
            $errs[]= 'El vehiculo del viaje no puede estar vac&iacute;o';
        }
        else
        {
            if (!isset($vehiculos[$viaje['fkvehiculo']]))
            {
                $viaje['fkvehiculo'] = '';
                $errs[]= 'El veh&iacute;culo del viaje no es correcto';
            }
        }
        // Grupo
        if (empty($viaje['fkgrupo']))
        {
            $viaje['fkgrupo'] = '';
            $errs[]= 'El grupo del viaje no puede estar vac&iacute;o';
        }
        else
        {
            if (!isset($grupos[$viaje['fkgrupo']]))
            {
                $viaje['fkgrupo'] = '';
                $errs[]= 'El grupo del viaje no es correcto';
            }
        }
        // Vehiculo en grupo
        if (!empty($viaje['fkgrupo']) && !empty($viaje['fkvehiculo']))
        {
            if (!isset($grupos[$viaje['fkgrupo']]['vehiculos'][$viaje['fkvehiculo']]))
            {
                $viaje['fkgrupo'] = '';
                $errs[]= 'El grupo del viaje no contiene al veh&iacute;culo seleccionado';
            }
        }
        // Conductor
        if (empty($viaje['fkconductor']))
        {
            $viaje['fkconductor'] = '';
            $errs[]= 'El conductor del viaje no puede estar vac&iacute;o';
        }
        else
        {
            if (!isset($conductores[$viaje['fkconductor']]))
            {
                $viaje['fkconductor'] = '';
                $errs[]= 'El conductor del viaje no es correcto';
            }
        }
        // Ruta
        if (empty($viaje['fkruta']))
        {
            $viaje['fkruta'] = '';
            $errs[]= 'La ruta del viaje no puede estar vac&iacute;a';
        }
        else
        {
            if (!isset($rutas[$viaje['fkruta']]))
            {
                $viaje['fkruta'] = '';
                $errs[]= 'La ruta del viaje no es correcta';
            }
        }
        // Dias
        if ($programar && ((empty($viaje['dias']) || !(is_array($viaje['dias'])))))
        {
            $viaje['dias'] = '';
            $errs[]= 'Debe seleccionar al menos un d&iacute;a de la semana para programar los viajes';
        }
        // Si no hay errores, checkear si es posibe el viaje
        if (empty($errs))
        {
            if ($programar)
            {
                $aCrear = $this->viajesACrear(false, $viaje);
                if (!empty($aCrear))
                {
                    $viaje['programados'] = array();
                    foreach ($aCrear as $viajeACrear)
                    {
                        if ($viajeACrear['estado'] == STATUS_ONLINE)
                        {
                            $viaje['programados'][]=$viajeACrear;
                        }
                    }
                    if (empty($viaje['programados']))
                    {
                        $errs[]='No hay viajes que se puedan programar en las fechas y el horario seleccionado';
                    }
                }
                else
                {
                    $errs[]='No hay viajes que se puedan programar en las fechas y el horario seleccionado';
                }
            }
            else
            {
                if (!$this->model->viajePosible($viaje['fkconductor'], $viaje['fkvehiculo'], $viaje['fkruta'], $viaje['salida'], $viajesEnLaFecha))
                {
                    if (!empty($viajesEnLaFecha))
                    {
                        foreach ($viajesEnLaFecha as $viajeEnFecha)
                        {
                            $err = $this->getErroresViajeNoDisponibe($viaje, $viajeEnFecha);
                            $errs[]= $err;
                        }
                    }
                    else
                    {
                        $errs[]= 'El viaje no pudo ser programado porque ha ocurrido un error inesperado';
                    }
                }
            }
        }
    }

    private function getErroresViajeNoDisponibe(&$viaje, $viajeEnFecha)
    {
        $err = 'Fecha '.date('d/m/Y H:i:s', $viajeEnFecha['salida_timestamp']).' hasta '.date('d/m/Y H:i:s', $viajeEnFecha['llegada_estimada_timestamp']).' tiene ';
        if (($viaje['fkconductor'] == $viajeEnFecha['fkconductor']) && ($viaje['fkvehiculo'] == $viajeEnFecha['fkvehiculo']))
        {
            $err .= 'al conductor y al veh&iacute;culo en viaje.';
        }
        else if ($viaje['fkconductor'] == $viajeEnFecha['fkconductor'])
        {
            $err .= 'al conductor en viaje.';
        }
        else if ($viaje['fkvehiculo'] == $viajeEnFecha['fkvehiculo'])
        {
            $err .= 'al veh&iacute;culo en viaje.';
        }
        else
        {
            $err .= 'errores';
        }
        return $err;
    }

    public function horarioLlegada()
    {
        // Login
        $this->userLoggedIn(true);
        $this->isAdmin(true);
        // Check
        $idRuta = $this->getValue('fkruta');
        $single = $this->getValue('single');
        if (empty($single) || ($single == 1))
        {

            $horarioSalida = $this->getValue('salida');
            $salidaTimestamp = (!empty($horarioSalida))?strtotime($horarioSalida):false;
            if (!empty($idRuta) && !empty($horarioSalida))
            {
                if ($duracionViaje = $this->model->duracionRutaSegunHorario($idRuta, $salidaTimestamp))
                {
                    $this->jSon(array('llegada' => date('d/m/Y H:i:s', $salidaTimestamp + $duracionViaje)));
                }
                else
                {
                    $this->jSon(array('err' => 'err'));
                }
            }
            else
            {
                $this->jSon(array('err' => 'err'));
            }
        }
        else
        {
            $this->jSon(array('err' => 'err'));
        }
    }

    public function viajesACrear($jSon = true, $viaje = false)
    {
        if (!$jSon)
        {
            $this->userLoggedIn(true);
            $this->isAdmin(true);
        }
        $viaje = (empty($viaje))?$this->getValue('viaje'):$viaje;
        if (!empty($viaje))
        {
            if (!empty($viaje['fkruta']) && (!empty($viaje['dias']) && (is_array($viaje['dias']))) && !empty($viaje['desde']) && !empty($viaje['hasta']) && !empty($viaje['horario']) && !empty($viaje['fkvehiculo']) && !empty($viaje['fkconductor']))
            {
                $primerFecha = strtotime($viaje['desde'] . ' '. $viaje['horario']);
                $desde       = strtotime($viaje['desde']);
                $hasta       = strtotime($viaje['hasta']);
                $timeHorario = $primerFecha - $desde;
                $oneDay      = (60*60*24);
                $fecha       = (($primerFecha) <= time())?$desde + $oneDay:$desde;
                $ret         = array();
                $durations   = array();
                $dias        = array();
                foreach($viaje['dias'] as $dia)
                {
                    $dias[$dia] = $dia;
                }
                $diaSemanas = array(
                    1 => 'Lun',
                    2 => 'Mar',
                    3 => 'Mie',
                    4 => 'Jue',
                    5 => 'Vie',
                    6 => 'Sab',
                    7 => 'Dom',
                );
                while ($fecha < $hasta)
                {
                    $weekday = date('N', $fecha);
                    if (isset($dias[$weekday]))
                    {
                        $duration = (isset($durations[$weekday]))?$durations[$weekday]:$this->model->duracionRutaSegunHorario($viaje['fkruta'], $fecha + $timeHorario);
                        $viajesEnLaFecha = array();
                        $viajePosible = $this->model->viajePosible($viaje['fkconductor'], $viaje['fkvehiculo'], $viaje['fkruta'], $fecha + $timeHorario, $viajesEnLaFecha);
                        $ret[] = array(
                            'dia'     => $diaSemanas[$weekday],
                            'salida'  => date('d/m/Y H:i', $fecha + $timeHorario),
                            'llegada' => date('d/m/Y H:i', $fecha + $timeHorario + $duration),
                            'estado'  => ($viajePosible)?STATUS_ONLINE:STATUS_OFFLINE,
                            'extra'   => ($viajePosible)?'El viaje se puede realizar con este veh&iaculo;culo y este conductor.':$this->getErroresViajeNoDisponibe($viaje, $viajesEnLaFecha[0]),
                            // Solo para insertar
                            'llegada_estimada_timestamp' => $fecha + $timeHorario + $duration,
                            'salida_timestamp'           => $fecha + $timeHorario,
                        );
                    }
                    $fecha = $fecha + $oneDay;
                }
            }
            else
            {
                $ret = array();
            }
        }
        else
        {
            $ret = array();
        }
        if ($jSon)
        {
            $this->jSon($ret);
        }
        else
        {
            return $ret;
        }
    }

    public function borrarViaje()
    {
        // Login
        $this->userLoggedIn();
        $this->isAdmin();
        // Id
        $idViaje = $this->getValue('id');
        if (!empty($idViaje))
        {
            if ($viaje = $this->model->getViaje($idViaje))
            {
                if ($viaje[$idViaje]['status'] == STATUS_PENDING)
                {
                    if ($this->model->borrarViaje($idViaje))
                    {
                        $this->notice('El viaje fue borrado con &eacute;xito');
                        $this->redirectTo(MODULE_VIAJES);
                    }
                    else
                    {
                        $this->error('El viaje no pudo ser borrado');
                        $this->redirectTo(MODULE_VIAJES);
                    }
                }
                else
                {
                    $this->error('Este viaje no se puede borrar');
                    $this->redirectTo(MODULE_VIAJES);
                }
            }
            else
            {
                $this->error('El viaje no es v&aacute;lido');
                $this->redirectTo(MODULE_VIAJES);
            }
        }
        else
        {
            $this->error('El viaje no es v&aacute;lido');
            $this->redirectTo(MODULE_VIAJES);
        }
    }

}
?>